//
//  HMHomeVewModel.swift
//  Weibo
//
//  Created by fuyu on 2017/7/26.
//  Copyright © 2017年 itteacher. All rights reserved.
//

import UIKit
import SDWebImage
//  封装首页尾部数据的网络请求
class HMHomeVewModel: NSObject {

        //数据源
    lazy var statusList: [HMStatusViewModel] = [HMStatusViewModel]()
    
    //  加载微博数据
    //  callBack: 闭包回调， true表示成功回调， false表示失败的回调
    func loadData(isUp:Bool, callBack: @escaping (Bool, String)->()) {
        let token = HMUserAccountViewModel.sharedViewModel.accessToken!
        //  获取上拉加载的微博id， 加载历史微博数据
        var maxId: Int64 = 0
        var sinceId: Int64 = 0
        
        if isUp {
            //  表示上拉加载
            maxId = statusList.last?.status?.id ?? 0
            if maxId > 0 {
                //  防止数据重复，不获取当前传入微博id的这数据
                maxId -= 1
            }
        } else {
            //  表示下拉刷新
            sinceId = statusList.first?.status?.id ?? 0
        }
        
        var message = "没有加载到最新的微博数据"
        

        
        HMNetworkTools.sharedTools.requestStatuses(access_token: token,maxId: maxId, sinceId: sinceId) { (response, error) in
            if error != nil {
                print("error: \(error!)")
                callBack(false, message)
                return
            }
            //  代码执行到此，网络请求成功
            let dic = response as! [String: Any]
            //  获取微博字典数组
            let statusDicArray = dic["statuses"] as! [[String: Any]]
            //  使用YYModel完成字典转模型
            //  HMStatus.self 表示获取类的class
            let statusModelArray = NSArray.yy_modelArray(with: HMStatus.self, json: statusDicArray) as! [HMStatus]
            
            var tempArray = [HMStatusViewModel]()
            
            //  创建调度组
            let group = DispatchGroup()
            
             //  遍历模型数组转成对应的ViewMode的数组
            for statusModel in statusModelArray {
                //  判断微博数据是否有单张图片
                if statusModel.pic_urls?.count == 1 {
                    
                    //下载的图片地址
                    let imageUrl = statusModel.pic_urls?.first?.thumbnail_pic
                    //  原创微博单张图片,需要下载
                    //  加入调度组
                    group.enter()
                    SDWebImageManager.shared().loadImage(with: URL(string: imageUrl!), options: [], progress: nil, completed: { (image, imageData, error, _, _, _) in
                        print("原创微博单张图片下载完成: url: \(imageUrl!)")
                        //  图片下载完成，从调度组离开
                        group.leave()
                    })
                }
                if statusModel.retweeted_status?.pic_urls?.count == 1 {
                    //  转发微博单张图片
                    //  下载的图片地址
                    let imageUrl = statusModel.retweeted_status?.pic_urls?.first?.thumbnail_pic
                    //  原创微博单张图片,需要下载
                    //  加入调度组
                    group.enter()
                    SDWebImageManager.shared().loadImage(with: URL(string: imageUrl!), options: [], progress: nil, completed: { (image, imageData, error, _, _, _) in
                        print("转发微博单张图片下载完成: url: \(imageUrl!)")
                        //  图片下载完成，从调度组离开
                        group.leave()
                    })
                }

                
                let viewModel = HMStatusViewModel()
                //  关联ViewModel使用模型
                viewModel.status = statusModel
                tempArray.append(viewModel)
            }
            
            if isUp {
                //  上拉加载，把请求回来的数据添加到原始数组的后面
                self.statusList.append(contentsOf: tempArray)
            } else {
                //  下拉刷新，把请求回来的数据添加到原始数据的最前面
                self.statusList.insert(contentsOf: tempArray, at: 0)
            }
            
            if tempArray.count > 0 {
                
                message = "加载了\(tempArray.count)条数据"
            }

            
            //异步任务都执行完成以后闭包回调
            group.notify(queue: DispatchQueue.main, execute: {
                //  成功回调加载微博数据
                print("所有的单张图片都下载完成了")
                callBack(true,message)
            })
            
        }
    }
}
